home *** CD-ROM | disk | FTP | other *** search
Wrap
Text File | 1992-12-24 | 8.9 KB | 393 lines | [ TEXT/PJMM]
unit EvaluateNodes; interface uses Globals, Commands, MatrixFunctions, MatrixOperations, Inverse; procedure evaluatenodes (var nodetable: hdlarrayhdlnoderecord; var numnodes: longint; var mrows, ncols: longint; var t: hdlextendarray; var store: boolean; var save: array2; var error: str255); implementation procedure evaluatenodes; label 888, 995, 998, 999; var i, j, k, lm, mn, kmat: longint; m1, n1, m2, n2, rowmax, colmax: longint; rank: longint; b1, b2, rows, cols: extended; realbinoperator, dummyname: stringsize; matrixoper: string30; r, realresult, condnum, determ: extended; amat, bmat, cmat: hdlsinglearraymatrix; anew, bnew, cnew: boolean; vRefNum: longint; err: OSErr; name: str255; fileinfo: fInfo; procedure OpenMatrixFile (var matpointer: longint; var mrows, ncols: longint; var dummymatrix: hdlsinglearraymatrix); var index: longint; rows, cols: extended; begin if not mfileopen^^[matpointer] then begin open(matfile^^[matpointer]^^, strvar^^[matpointer]^^); mfileopen^^[matpointer] := true; end; reset(matfile^^[matpointer]^^); read(matfile^^[matpointer]^^, rows); read(matfile^^[matpointer]^^, cols); mrows := round(rows); ncols := round(cols); blocksize := longint(10 * mrows * ncols + 20); dummymatrix := hdlsinglearraymatrix(NewHandle(blocksize)); dummymatrix^^[1] := mrows; dummymatrix^^[2] := ncols; for index := 3 to mrows * ncols + 2 do read(matfile^^[matpointer]^^, dummymatrix^^[index]); if mfileopen^^[matpointer] then begin close(matfile^^[matpointer]^^); mfileopen^^[matpointer] := false; end; end; procedure GetMatrix (var matpointer: longint; var dummymatrix: hdlsinglearraymatrix); var index: longint; begin if matrixstoredinfile^^[matpointer] then OpenMatrixFile(matpointer, mrows, ncols, dummymatrix); if not matrixstoredinfile^^[matpointer] then begin mrows := round(storematrix^^[matpointer]^^[1]); ncols := round(storematrix^^[matpointer]^^[2]); blocksize := longint(10 * mrows * ncols + 20); dummymatrix := hdlsinglearraymatrix(NewHandle(blocksize)); for index := 1 to mrows * ncols + 2 do dummymatrix^^[index] := storematrix^^[matpointer]^^[index]; end; end; procedure GetNodeMatrix (var matpointer: longint; var dummymatrix: hdlsinglearraymatrix); var index: longint; begin mrows := round(nodematrix^^[matpointer]^^[1]); ncols := round(nodematrix^^[matpointer]^^[2]); blocksize := longint(10 * mrows * ncols + 20); dummymatrix := hdlsinglearraymatrix(NewHandle(blocksize)); for index := 1 to mrows * ncols + 2 do dummymatrix^^[index] := nodematrix^^[matpointer]^^[index]; end; procedure GetConstantMatrix (var realnumber: extended; var dummymatrix: hdlsinglearraymatrix); begin mrows := 1; ncols := 1; blocksize := longint(30); dummymatrix := hdlsinglearraymatrix(NewHandle(blocksize)); dummymatrix^^[1] := 1; dummymatrix^^[2] := 1; dummymatrix^^[3] := realnumber; end; begin error := ''; amat := nil; bmat := nil; cmat := nil; anew := false; bnew := false; cnew := false; for i := 1 to numnodes do begin t^^[i] := hdlextended(NewHandle(SizeOf(extended))); readstring(nodetable^^[i]^^.rop.index, b2); mn := round(b2); if nodetable^^[i]^^.roptype = 'node' then begin b2 := t^^[mn]^^; mn := round(b2); GetNodeMatrix(mn, dummymatrix); end; if nodetable^^[i]^^.roptype = 'constant' then GetConstantMatrix(b2, dummymatrix); if nodetable^^[i]^^.roptype = 'matrix' then GetMatrix(mn, dummymatrix); blocksize := longint(10 * mrows * ncols + 20); bmat := hdlsinglearraymatrix(NewHandle(blocksize)); bnew := true; for j := 1 to mrows * ncols + 2 do bmat^^[j] := dummymatrix^^[j]; m2 := round(bmat^^[1]); n2 := round(bmat^^[2]); if (nodetable^^[i]^^.op.index = equals) then begin t^^[i]^^ := i; blocksize := longint(10 * mrows * ncols + 20); nodematrix^^[i] := hdlsinglearraymatrix(NewHandle(blocksize)); for j := 1 to mrows * ncols + 2 do nodematrix^^[i]^^[j] := dummymatrix^^[j]; goto 888; end; matrixoper := nodetable^^[i]^^.op.index; if ((nodetable^^[i]^^.optype = 'unary') or (nodetable^^[i]^^.optype = 'function')) then begin if matrixoper = minus then for k := 3 to mrows * ncols + 2 do dummymatrix^^[k] := -dummymatrix^^[k] else if matrixoper = quote then matrixtranspose(dummymatrix, mrows, ncols, matrixoper) else if matrixoper = 'inv' then Inverse(dummymatrix, mrows, ncols, error) else matrixfunctions(dummymatrix, mrows, ncols, matrixoper, realresult); t^^[i]^^ := i; blocksize := longint(10 * mrows * ncols + 20); nodematrix^^[i] := hdlsinglearraymatrix(NewHandle(blocksize)); for j := 1 to mrows * ncols + 2 do nodematrix^^[i]^^[j] := dummymatrix^^[j]; goto 888; end; readstring(nodetable^^[i]^^.lop.index, b1); lm := round(b1); if nodetable^^[i]^^.loptype = 'node' then begin b1 := t^^[lm]^^; lm := round(b1); GetNodeMatrix(lm, dummymatrix); end; if nodetable^^[i]^^.loptype = 'matrix' then GetMatrix(lm, dummymatrix); if nodetable^^[i]^^.loptype = 'constant' then GetConstantMatrix(b1, dummymatrix); blocksize := longint(10 * mrows * ncols + 20); amat := hdlsinglearraymatrix(NewHandle(blocksize)); anew := true; for j := 1 to mrows * ncols + 2 do amat^^[j] := dummymatrix^^[j]; m1 := round(amat^^[1]); n1 := round(amat^^[2]); if (matrixoper = asterisk) then blocksize := longint(10 * m1 * n2 + 20); if (matrixoper <> asterisk) then begin rowmax := m1; colmax := n1; if (m2 >= rowmax) then rowmax := m2; if (n2 >= colmax) then colmax := n2; blocksize := longint(10 * rowmax * colmax + 20); end; cmat := hdlsinglearraymatrix(NewHandle(blocksize)); cnew := true; matrixoperations(amat, bmat, cmat, m1, n1, m2, n2, mrows, ncols, matrixoper, error, realresult); if error <> '' then goto 999; t^^[i]^^ := i; nodematrix^^[i] := hdlsinglearraymatrix(NewHandle(blocksize)); for j := 1 to mrows * ncols + 2 do nodematrix^^[i]^^[j] := cmat^^[j]; 888: if anew then begin DisposHandle(handle(amat)); amat := nil; anew := false; end; if bnew then begin DisposHandle(handle(bmat)); bmat := nil; bnew := false; end; if cnew then begin DisposHandle(handle(cmat)); cmat := nil; cnew := false; end; end; 995: for i := 1 to numnodes - 1 do begin DisposHandle(handle(nodematrix^^[i])); nodematrix^^[i] := nil; DisposHandle(handle(t^^[i])); t^^[i] := nil; end; mrows := round(nodematrix^^[numnodes]^^[1]); ncols := round(nodematrix^^[numnodes]^^[2]); blocksize := longint(10 * mrows * ncols + 20); if save[2] <> equals then goto 998; createamatrix(save[1], mrows, ncols, k); if matrixstoredinfile^^[k] then begin if not mfileopen^^[k] then begin open(matfile^^[k]^^, strvar^^[k]^^); {Open up the file, matfile^^[k], and prepare it} mfileopen^^[k] := true; {for writing.} end; rewrite(matfile^^[k]^^); for j := 1 to mrows * ncols + 2 do write(matfile^^[k]^^, nodematrix^^[numnodes]^^[j]); if mfileopen^^[k] then begin close(matfile^^[k]^^); mfileopen^^[k] := false; end; end; if not matrixstoredinfile^^[k] then for j := 1 to mrows * ncols + 2 do storematrix^^[k]^^[j] := nodematrix^^[numnodes]^^[j]; 998: dummyname := 'ans'; createamatrix(dummyname, mrows, ncols, k); if matrixstoredinfile^^[k] then begin if not mfileopen^^[k] then begin open(matfile^^[k]^^, strvar^^[k]^^); {Open up the file, matfile^^[k], and prepare it} mfileopen^^[k] := true; {for writing.} end; rewrite(matfile^^[k]^^); for j := 1 to mrows * ncols + 2 do write(matfile^^[k]^^, nodematrix^^[numnodes]^^[j]); if mfileopen^^[k] then begin close(matfile^^[k]^^); mfileopen^^[k] := false; end; end; if not matrixstoredinfile^^[k] then for j := 1 to mrows * ncols + 2 do storematrix^^[k]^^[j] := nodematrix^^[numnodes]^^[j]; name := strvar^^[k]^^; vRefNum := 2; fileinfo.fdFlags := fInvisible; err := SetFInfo(name, vRefNum, fileinfo); if (mrows = 1) and (ncols = 1) then t^^[numnodes]^^ := nodematrix^^[numnodes]^^[3] else t^^[numnodes]^^ := k; 999: DisposHandle(handle(dummymatrix)); dummymatrix := nil; DisposHandle(handle(nodematrix^^[numnodes])); nodematrix^^[numnodes] := nil; cleanupvariables; end; end.